package pe.gob.bcrp.sgci.gestion.reportes.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DateUtil {
	public static String FORMATO_FECHA_YYYYMMDD = "yyyyMMdd";
	public static String FORMATO_FECHA_DD_MM_YYYY = "dd/MM/yyyy";
	public static String FORMATO_FECHA_YYYY_MM_DD = "yyyy-MM-dd";
	
	public static String dateToString(Date fecha, String formato){
		DateFormat formatter = new SimpleDateFormat(formato);
		String s = formatter.format(fecha);
		return s;
	}
	
	public static String dateToStringFormatoReporte(Date fechaProceso){
		String fechaProcesoString = dateToString(fechaProceso, "yyyy-MM-dd");
		String diaProceso = fechaProcesoString.substring(8,10);
		String mesProceso = fechaProcesoString.substring(5, 7);
		String anioProceso = fechaProcesoString.substring(0, 4);
		return diaProceso+" DE "+calculaMes(mesProceso)+" DE "+anioProceso;
	}
	public static String dateToStringFormatoReporte(String fechaProceso){
		//fechaProceso es un String con formato yyyy-MM-dd
		String diaProceso = fechaProceso.substring(8,10);
		String mesProceso = fechaProceso.substring(5, 7);
		String anioProceso = fechaProceso.substring(0, 4);
		return diaProceso+" DE "+calculaMes(mesProceso)+" DE "+anioProceso;
	}
	public static String datesToStringFormatoReporte(Date fechaDesde, Date fechaHasta){
		String fechaDesdeString = dateToString(fechaDesde, "yyyy-MM-dd");
		String fechaHastaString = dateToString(fechaHasta, "yyyy-MM-dd");
		String diaDesde = fechaDesdeString.substring(8,10);
		String mesDesde = fechaDesdeString.substring(5, 7);
		String anioDesde = fechaDesdeString.substring(0, 4);
		String diaHasta = fechaHastaString.substring(8,10);
		String mesHasta = fechaHastaString.substring(5, 7);
		String anioHasta = fechaHastaString.substring(0, 4);
		return "DEL " +diaDesde+" DE "+calculaMes(mesDesde)+" DE "+anioDesde
				+" AL "+diaHasta+" DE "+calculaMes(mesHasta)+" DE "+anioHasta;
	}	
	
	public static String getMes(Date fecha){
		String fechaString = dateToString(fecha, "yyyy-MM-dd");
		String mes = fechaString.substring(5, 7);
		if(mes.equals("01"))  return "ENERO";
		else if(mes.equals("02"))  return "FEBRERO";
		else if(mes.equals("03"))  return "MARZO";
		else if(mes.equals("04"))  return "ABRIL";
		else if(mes.equals("05"))  return "MAYO";
		else if(mes.equals("06"))  return "JUNIO";
		else if(mes.equals("07"))  return "JULIO";
		else if(mes.equals("08"))  return "AGOSTO";
		else if(mes.equals("02"))  return "SETIEMBRE";
		else if(mes.equals("02"))  return "OCTUBRE";
		else if(mes.equals("02"))  return "NOVIEMBRE";
		else return "DICIEMBRE";
	}
	
	public static String getDia(Date fecha){
		String fechaString = dateToString(fecha, "yyyy-MM-dd");
		String mes = fechaString.substring(5, 7);
		int anio = Integer.parseInt(fechaString.substring(0, 4));
		if(mes.equals("01") || mes.equals("03") || mes.equals("05") || mes.equals("07") || mes.equals("08") || mes.equals("10")|| mes.equals("12"))
			return "31";
		else if(mes.equals("04")|| mes.equals("06") || mes.equals("09") || mes.equals("11")) 
			return "30";
		else if(anio % 4 == 0){
			return "28";
		}else{
			return "29";
		}
	}
	
	public static String calculaMes(String mes){
		String[] listaMes = {"ENERO", "FEBRERO", "MARZO", "ABRIL", "MAYO", "JUNIO", "JULIO", "AGOSTO", "SETIEMBRE", "OCTUBRE", "NOVIEMBRE", "DICIEMBRE"};
		return listaMes[new Integer(mes)-1];
	}
	
	public static Date stringToDate(String fecha, String formato){
		DateFormat formatter = new SimpleDateFormat(formato);
		Date date = null;
		try {
			date = formatter.parse(fecha);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	
	public static long restaFechas(Date fechaMinuendo, Date fechaSustraendo){
		long fechaMinuendoMs = fechaMinuendo.getTime();
		long fechaSustraendoMs = fechaSustraendo.getTime();		
		return (fechaMinuendoMs-fechaSustraendoMs);
	}
	
	public static boolean validarFechaValRango(
			Date fechaValor, Date fechaIni, Date fechaFin, boolean rangoFinal) {
		boolean resp = false;
		Calendar fechaCalValor = new GregorianCalendar();
		Calendar fechaCalIni = new GregorianCalendar();
		Calendar fechaCalFin = new GregorianCalendar();
		
		if(fechaValor != null) {
			fechaCalValor.setTime(fechaValor); 
			fechaCalValor.set(Calendar.HOUR, 0);
			fechaCalValor.set(Calendar.MINUTE, 0);
			fechaCalValor.set(Calendar.SECOND, 0);
			fechaCalValor.set(Calendar.MILLISECOND, 0);
			fechaCalValor.set(Calendar.AM_PM, 0);
			fechaCalValor.set(Calendar.HOUR_OF_DAY, 0);
		}
		
		if(fechaIni != null) {
			fechaCalIni.setTime(fechaIni); 
			fechaCalIni.set(Calendar.HOUR, 0);
			fechaCalIni.set(Calendar.MINUTE, 0);
			fechaCalIni.set(Calendar.SECOND, 0);
			fechaCalIni.set(Calendar.MILLISECOND, 0);
		}
		
		if(fechaFin != null) {
			fechaCalFin.setTime(fechaFin); 
			fechaCalFin.set(Calendar.HOUR, 0);
			fechaCalFin.set(Calendar.MINUTE, 0);
			fechaCalFin.set(Calendar.SECOND, 0);
			fechaCalFin.set(Calendar.MILLISECOND, 0);
		}
		
		
		if(fechaCalIni != null && fechaCalValor.compareTo(fechaCalIni) >= 0) {
			if(fechaFin != null) {
				if(fechaCalValor.compareTo(fechaCalFin) <= 0) {
					resp = true;
				}
			} else {
				if(rangoFinal) {
					resp = true;
				} 
			}
		}
		
		return resp;
	}	
	
	public static boolean esFechaMenor(Date fecha1, Date fecha2) {
		boolean resp = false;
		Calendar fechaCal1 = new GregorianCalendar();
		Calendar fechaCal2 = new GregorianCalendar();
		
		if(fecha1 != null) {
			fechaCal1.setTime(fecha1); 
			fechaCal1.set(Calendar.HOUR, 0);
			fechaCal1.set(Calendar.MINUTE, 0);
			fechaCal1.set(Calendar.SECOND, 0);
			fechaCal1.set(Calendar.MILLISECOND, 0);
			fechaCal1.set(Calendar.AM_PM, 0);
			fechaCal1.set(Calendar.HOUR_OF_DAY, 0);
		}
		
		if(fecha2 != null) {
			fechaCal2.setTime(fecha2); 
			fechaCal2.set(Calendar.HOUR, 0);
			fechaCal2.set(Calendar.MINUTE, 0);
			fechaCal2.set(Calendar.SECOND, 0);
			fechaCal2.set(Calendar.MILLISECOND, 0);
			fechaCal2.set(Calendar.AM_PM, 0);
			fechaCal2.set(Calendar.HOUR_OF_DAY, 0);
		}
		
		if(fecha1 != null && fecha2 != null) {
			if(fecha1.compareTo(fecha2) < 0) {
				resp = true;
			}
		}
		
		return resp;
	}
	
	public static boolean esFechaMayor(Date fecha1, Date fecha2) {
		boolean resp = false;
		Calendar fechaCal1 = new GregorianCalendar();
		Calendar fechaCal2 = new GregorianCalendar();
		
		if(fecha1 != null) {
			fechaCal1.setTime(fecha1); 
			fechaCal1.set(Calendar.HOUR, 0);
			fechaCal1.set(Calendar.MINUTE, 0);
			fechaCal1.set(Calendar.SECOND, 0);
			fechaCal1.set(Calendar.MILLISECOND, 0);
			fechaCal1.set(Calendar.AM_PM, 0);
			fechaCal1.set(Calendar.HOUR_OF_DAY, 0);
		}
		
		if(fecha2 != null) {
			fechaCal2.setTime(fecha2); 
			fechaCal2.set(Calendar.HOUR, 0);
			fechaCal2.set(Calendar.MINUTE, 0);
			fechaCal2.set(Calendar.SECOND, 0);
			fechaCal2.set(Calendar.MILLISECOND, 0);
			fechaCal2.set(Calendar.AM_PM, 0);
			fechaCal2.set(Calendar.HOUR_OF_DAY, 0);
		}
		
		if(fecha1 != null && fecha2 != null) {
			if(fecha1.compareTo(fecha2) > 0) {
				resp = true;
			}
		}
		
		return resp;
	}
	
	public static boolean fechaE(Date fecha1, Date fecha2) {
		boolean resp = false;
		Calendar fechaCal1 = new GregorianCalendar();
		Calendar fechaCal2 = new GregorianCalendar();
		
		if(fecha1 != null) {
			fechaCal1.setTime(fecha1); 
			fechaCal1.set(Calendar.HOUR, 0);
			fechaCal1.set(Calendar.MINUTE, 0);
			fechaCal1.set(Calendar.SECOND, 0);
			fechaCal1.set(Calendar.MILLISECOND, 0);
			fechaCal1.set(Calendar.AM_PM, 0);
			fechaCal1.set(Calendar.HOUR_OF_DAY, 0);
		}
		
		if(fecha2 != null) {
			fechaCal2.setTime(fecha2); 
			fechaCal2.set(Calendar.HOUR, 0);
			fechaCal2.set(Calendar.MINUTE, 0);
			fechaCal2.set(Calendar.SECOND, 0);
			fechaCal2.set(Calendar.MILLISECOND, 0);
			fechaCal2.set(Calendar.AM_PM, 0);
			fechaCal2.set(Calendar.HOUR_OF_DAY, 0);
		}
		
		if(fecha1 != null && fecha2 != null) {
			if(fecha1.compareTo(fecha2) > 0) {
				resp = true;
			}
		}
		
		return resp;
	}	
}